package cn.shanguoyu.base.springboot.starter.idempotent.aop;

import cn.shanguoyu.base.springboot.starter.idempotent.enums.IdempotentSceneEnum;
import cn.shanguoyu.base.springboot.starter.idempotent.enums.IdempotentTypeEnum;

import java.lang.annotation.*;

/**
 * @description:幂等注解
 * @author：sgy
 * @date: 2023-06-03
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Idempotent {
    /**
     * 幂等key，只有在 {@link Idempotent#type()} 为 {@link IdempotentTypeEnum#SPEL} 时生效
     */
    String key() default "";

    /**
     * 触发幂等失败逻辑时，返回的错误提示信息
     */
    String message() default "您操作太快，请稍后再试";
    /**
     * 验证幂等类型，支持多种幂等方式
     * RestAPI 建议使用 {@link IdempotentTypeEnum#TOKEN} 或 {@link IdempotentTypeEnum#PARAM}
     * 其它类型幂等验证，使用 {@link IdempotentTypeEnum#SPEL}
     */
    IdempotentTypeEnum type() default IdempotentTypeEnum.PARAM;
    /**
     * 验证幂等场景，支持多种 {@link IdempotentSceneEnum}
     */
    IdempotentSceneEnum scene() default IdempotentSceneEnum.RESTAPI;
    /**
     * 设置Key前缀
     * MQ幂等去重，param参数幂等，SPEL幂等，可选设置
     * {@link IdempotentSceneEnum#MQ} and {@link IdempotentTypeEnum#SPEL} 时生效
     */
    String uniqueKeyPrefix() default "";
    /**
     * 设置Key过期时间
     * 单位秒，默认 1 小时
     * MQ幂等去重，param参数幂等，SPEL幂等
     * {@link IdempotentSceneEnum#MQ} and {@link IdempotentTypeEnum#SPEL} 时生效
     */
    long keyTimeout() default 3600L;
}
